在 debian 11 系统里安装 osticket 1.17.3

当前最新版本是 osticket 1.17.3, 要求是php8.1。

遇到的第一个问题是:osticket 中显示的工单时间比现时的要快几个小时。debian 11系统里设置的是“中国标准时间 CST”,即北京时间。虽然 osticket 里可以设置时区,但当php.ini里设置时区为 Asia/Shanghai 时,osticket 认为数据库里的时区 CST 是 America/Chicago 时区。

可尝试的方法是按照网友说的,修改 include/class.config.php 里的 function getDbTimezone() 。手动设置时区。如 修改为: $dvd_db_timezone='Asia/Shanghai'; return $dvd_db_timezone;

第二个问题是:管理面板里的 ajax 部分页面不可访问到,如网址 https://example.com/scp/ajax.php/help/tips/settings.system , nginx 会报 404 错误。原因是 osticket 默认只支持 apache 和 iis。

可能问的人多了,它直接放了一个配置内容参考:

server {
        listen 443 ssl http2;
        ssl_certificate           /root/.acme.sh/example.com/fullchain.cer;
        ssl_certificate_key       /root/.acme.sh/example.com/example.com.key;

        root /var/www/example.com/osticket;

        # Add index.php to the list if you are using PHP
        index index.php index.html index.htm index.nginx-debian.html;

        server_name example.com;

        set $path_info "";

        location ~ /include {
            deny all;
            return 403;
        }

        if ($request_uri ~ "^/api(/[^\?]+)") {
            set $path_info $1;
        }

        location ~ ^/api/(?:tickets|tasks).*$ {
            try_files $uri $uri/ /api/http.php?$query_string;
        }

        if ($request_uri ~ "^/scp/.*\.php(/[^\?]+)") {
            set $path_info $1;
        }

        if ($request_uri ~ "^/.*\.php(/[^\?]+)") {
            set $path_info $1;
        }
        location ~ ^/scp/ajax.php/.*$ {
            try_files $uri $uri/ /scp/ajax.php?$query_string;
        }

        location ~ ^/ajax.php/.*$ {
            try_files $uri $uri/ /ajax.php?$query_string;
        }

        location / {
            try_files $uri $uri/ index.php;
        }

        location ~ \.php$ {
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
            fastcgi_param  PATH_INFO        $path_info;
            fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        }
}

server {
        listen 80;
        server_name example.com;
        return 301 https://$server_name$request_uri;
}

第三个问题是:用php的mail()函数发出的邮件正文不可读的,是base64后的代码。原因可能是 osticket 带的发件组件 Laminas-Mail 不是最新的,当环境是php8时,会打乱邮件的标头,exim认为原本多行的标头仅是一行,所以阅读邮件时不能正常识别。

可以尝试的方法是在 osticket/include/laminas-mail/src/Transport/Sendmail.php 文件中,用 if (PHP_VERSION_ID < 80000 && ! $this->isWindowsOs()) { 替换 if (! $this->isWindowsOs()) {

参考:

将 exim4 收取的邮件,用 router 和 transport 转给脚本处理 piping - debian

环境:debian 11, exim4, php8.1, osticket-1.17
需求:用exim接收邮件,将邮件通过 piping 交给 osticket 的 php 脚本处理

过程:

  1. 新增一条 router 配置文件,如 /etc/exim4/conf.d/router/050_exim4-config_osticket
  2. 050_exim4-config_osticket 内容如下。意思要将support@localdomain的邮件交给osticket_transport受理

    osticket_router:
     driver = accept
     local_parts = support
     transport = osticket_transport
  3. 新增 osticket_transport 的配置文件,如 /etc/exim4/conf.d/transport/25_exim4-config_osticket_pipe
  4. 25_exim4-config_osticket_pipe 内容如下。意思是将邮件交给 /var/www/public_html/api/pipe.php 处理

    osticket_transport:
     driver = pipe
     command = /usr/bin/php8.1 /var/www/public_html/api/pipe.php
  5. 将新增的配置文件内容添加到模板中,update-exim4.conf.template -r
  6. 更新exim的配置,update-exim4.conf
  7. 重载 systemctl reload exim4 的服务
  8. 可通过如 exim4 -bt support@localdomain 的命令来检查新设置的 router 和 transport 是否生效

参考:

去坚强百货超市买鲈鱼

约十工前,我在果园好友超市买了条鲈鱼,一斤22元吊钱。“主任”话坚强百货的会便宜下,17吊左右。差5吊钱?今天上午约十点,我从御水出发,要到坚强百货买鲈鱼,爱撑几吊钱来。

走了约半只钟头,进门上二楼。行超市嘅人不多,睇到入口附近嘅西红柿,特价“十吊钱三斤”,我忍住不曾买。行到姜蒜区,网袋装稳嘅老姜,爱12吊钱,我也不买。我走到靠墙摆两排玻璃水缸的水鱼区,在写着18.9元/斤的鲈鱼缸前,企稳,左望右望,冇人搭。我走近在旁边往玻璃缸撒盐的、着稳红色工作服的人。
“尔好。我买鱼。”我讲。
“你自己拿网挑鱼就行。”吖姨看了我一小会,用普通话回答。
我转身回到鲈鱼缸前,抄起上排的一个鱼兜,往水缸里一探,有条鱼即刻钻进兜里,我提起来。走到红衣的吖姨前,她指着附近另一个吖姨,说到那儿打称。我提着网兜走到打称的吖姨前,平举着网兜,说“打下称”。吖姨拿了个胶袋伸手进网蒙鱼。鱼在网兜里蹦,忽上忽下地,不配合。“尔放落来,放到地下来。”吖姨话。于是我将网兜一端着地,吖姨顺利将鱼装进胶袋,还话,“系鱼麻。”怎么?鱼麻较不好食咪?买鱼公较抵咪?我心里打了几个问号。“包摞咪?”我问吖姨。吖姨指着一个地方话,“系。到那里。”我将胶袋递上“杀鱼台”,一只大哥冇两下帮我整好,递出窗口。“帮我斩成两段。”我不曾接,话。

我走到收银台,“有没会员卡?”姑娘用普通话问。“没。”我划着手机,准备扫码付款。姑娘从柜子下扯出一个胶袋,加在那个装着鱼,有鱼血、湿的胶袋上。我低稳头,睇手机,不曾睇路。走出四、五步时,当我抬头不知要往哪里出时,正好睇到前面有只人嘅腰背,我就跟着前边那只腰背走。走了几步,我再一抬头,惊讶地发现,我又见到卖水果嘅摊档了。我慌张了,回转头问一个着红衫嘅吖姨,“我岩岩买了条鱼,不知头,又走进超市了,吖咪爱从收银台那里出咪?”吖姨看了我下,没听明白,我赶紧用普通话又将意思说了一遍。吖姨用手指托着装鱼的胶袋看了一下,问我有没小票。我说我没拿小票。她说那你就收银台那儿出去吧。我又来到收银台,走到之前那个姑娘的岗线上,前边有两个人排队结账。姑娘看到我时,有点奇怪。我赶忙解释说,不小心又走了进来,刚才买鱼付了款的。我还特意将装着鱼的胶袋举高了让她看。姑娘边为前面的个顾客装东西,边说,“好的。我说你怎么又来了呢。”我好尴尬,经常在生疏的环境里趟路或不知所措。

用 curl 检测端口是否可连接 - http 返回码 - 证书有效期 - Shell

#!/bin/bash

# refer: https://www.baeldung.com/linux/check-website-availablilty and https://curl.se/mail/archive-2022-04/0027.html

trap "exit 1" TERM
export TOP_PID=$$
STDOUTFILE=".tempCurlStdOut" # temp file to store stdout
> $STDOUTFILE # cleans the file content

# Argument parsing follows our specification
for i in "$@"; do
  case $i in
#    http*)
#      WEBPAGE="${i#*=}"
#      shift
#      ;;
    -n=*|--notWantedContent=*)
      NOTWANTEDCONTENT="${i#*=}"
      shift
      ;;
    -r=*|--requiredContent=*)
      REQUIREDCONTENT="${i#*=}"
      shift
      ;;
    -e=*|--email=*)
      EMAIL="${i#*=}"
      shift
      ;;
    -s|--silent)
      SILENT=true
      shift
      ;;
    -t|--testTcpPortOnly)
      TESTTCPPORTONLY=true
      shift
      ;;      
#    *)
#      >&2 echo "Unknown option: $i" # stderr
#      exit 1
#      ;;
    *)
      WEBPAGE="${i#*=}"
      shift      
      ;;
    *)
      ;;
  esac
done

if test -z "$WEBPAGE"; then
    >&2 echo "Missing required URL" # stderr
    exit 1;
fi

function tcp_port_is_open {
  local exit_status_code
#   curl -t '' --connect-timeout 2 -s telnet://"$1:$2" </dev/null
   URL=${WEBPAGE#*//*}
   curl -t '' --connect-timeout 2 -s telnet://"$URL" </dev/null
   exit_status_code=$?
   case $exit_status_code in
     49) return 0 ;;
     *) return "$exit_status_code" ;;
   esac
}

function stdOutput { 
    if ! test "$SILENT" = true; then
        echo "$1"
    fi
}

function stdError { 
    if ! test "$SILENT" = true; then
        >&2 echo "$1" # stderr
    fi
    if ! test -z "$EMAIL"; then
        echo -e "Subject: $WEBPAGE is not working\n\nThe error is: $1" | msmtp $EMAIL
    fi
    kill -s TERM $TOP_PID # abort the script execution
}

if tcp_port_is_open > /dev/null 2>&1 ; then
    if test "$TESTTCPPORTONLY" = true; then
        stdOutput "TCP port is open -> OK"
    else
#            stdOutput "Internet connectivity OK"
    HTTPCODE=$(curl --max-time 5 --silent --write-out %{response_code} --output "$STDOUTFILE" "$WEBPAGE")
    CONTENT=$(<$STDOUTFILE) # if there are no errors, this is the HTML code of the web page
        if test $HTTPCODE -eq 200; then
            stdOutput "HTTP STATUS CODE $HTTPCODE -> OK"
        else
            stdError "HTTP STATUS CODE $HTTPCODE -> Has something gone wrong?"
        fi
        if ! test -z "$NOTWANTEDCONTENT"; then
            if echo "$CONTENT" | grep -iq "$NOTWANTEDCONTENT"; then # case insensitive check
                stdError "Not wanted content '$NOTWANTEDCONTENT'"
            fi
        fi
        if ! test -z "$REQUIREDCONTENT"; then
            if ! echo "$CONTENT" | grep -iq "$REQUIREDCONTENT"; then # case insensitive check
                stdError "Required content '$REQUIREDCONTENT' is absent"
            fi
        fi
        if echo "$WEBPAGE" | grep -iq "https"; then # case insensitive check
            EXPIREDATE=$(curl --max-time 5 --verbose --head --stderr - "$WEBPAGE" | grep "expire date" | cut -d":" -f 2- | date -f - "+%s")
            DAYS=$(( ($EXPIREDATE - $(date "+%s")) / (60*60*24) )) # days remaining to expiration
            if test $DAYS -gt 7; then
                stdOutput "No need to renew the SSL certificate. It will expire in $DAYS days."
            else
                if test $DAYS -gt 0; then
                    stdError "The SSL certificate should be renewed as soon as possible ($DAYS remaining days)."
                else
                    stdError "The SSL certificate IS ALREADY EXPIRED!"
                fi
            fi
        fi
    fi    
else
    stdError "TCP port is close -> Has something gone wrong?"
    exit 1
fi

例子:

liujia@moni:~/check$ ./c.sh anqun.org:3389 -t
TCP port is close -> Has something gone wrong?
liujia@moni:~/check$ ./c.sh anqun.org:3390 -t
TCP port is open -> OK
liujia@moni:~/check$ ./c.sh http://anqun.org:80
HTTP STATUS CODE 200 -> OK
liujia@moni:~/check$ ./c.sh https://anqun.org:443
TCP port is close -> Has something gone wrong?
liujia@moni:~/check$ ./c.sh https://liujia.anqun.org:443
HTTP STATUS CODE 200 -> OK
No need to renew the SSL certificate. It will expire in 59 days.
liujia@moni:~/check$ ./c.sh https://hy.anqun.org:443 -e=i@liujia.anqun.org
TCP port is close -> Has something gone wrong?

到邮政银行网点办理提高手机转账限额业务

我看到网友说“拼多多”app上买东西,有时可以叠加优惠券,能比淘宝、京东便宜一些。我试着用旧手机上的“拼多多”app下单买了个小的家用交换机,是能便宜约20块钱。在使用“拼多多”app时,屏幕上老弹全屏的动画,还有大字的标题,如“你真幸运”、“这次你一定能提现”之类,很吸引眼球的字。我情不自禁地跟着它的节奏,不断地点开很多个“红包”。不自觉中,十几分钟过去后,我自以为中了很多的钱,兴冲冲地在微信上查看,确实是有几笔入款,但都是0.01元,我哭笑不得。

我想了想,如果“拼多多”上有“羊毛”可以薅,那么现在各银行app上是不是也有积分或微信立减金的活动可以参加呢?我在手机上安装了邮政储蓄银行的app,照着提示添加银行卡之类的。我试了试邮政银行手机app上的转账功能,得知它限额了,显示我的转账金额是每天1万元。对于我来说,1万元的额度,是够用的,因为平时我卡上钱也就几百块。但当我看到网友他们一般单日的转账限额是50万,马上感觉到好像矮他们一等,我不服气啊。我想要去银行网点,申请提高转账的额度。

昨天下午,我先去中山路的邮政银行网点,因为近。我在厅中的前台站了站,一个戴口罩、戴眼镜的工作人员来问。我说了原因,她问我的卡是不是二类卡,我说是一类的。她让我到旁边的ATM机,插卡“证明”一下我的卡是一类卡。我不肯,因为我这卡是十几年前办的,那时还没分一类卡、二类卡的吧。我拿出手机,打开邮政银行app,把显示限额的界面给她看。她看了后,没告诉我怎么解决。恰好这时,有另一个工作人员路过,她截住了,将我交给了她。新来的工作人员让我等一下,她进去侧间,拿出一只笔样的东西,喊我将手机放到旁边的台面上。我又不肯,我就半举着手机,让她倒拿着一根笔,在我的手机屏幕上点戳操作。之后,她确认app上的限额是无法自行更改的。她说要我去和平印象的网点办理。我心里觉得纳闷,这个网点不是也有柜台窗口吗?为什么这里不可以办理提额的业务?我问她能不能取号排队,她说不能,原因是现在是下午四点四十分钟,五点就要下班交接,不开新号了。我听了,像气球泄了气般,收起手机就离开了。

今天吃过早餐,我去位于新城区“和平印象”的邮政银行网点。我不记得“和平印象”的楼盘在哪,以为邮政银行和工行、建行、农行一样在和平大道旁,不难找的。我是从工行旁的路往里走,绕到“百盛”楼盘后边又转出来。刚走出,我抬台看到有“邮政银行”的字样,拉开玻璃门,我进去。我看到就一个前台,坐着个保安,旁边是一个楼梯,没其他人。我心虚地问,
“顶里吖咪邮政银行营业厅?”
“尔办惹业务?”
“手机银行提额。”
“旁边。”保安用手指了指门外。

我懞懞然走出来,几乎不用挪开步,转个身,果真,抬头又看见着一个“邮政银行”的招牌。这个宽些的门店,像个银行网点了。我走入。
“办惹业务?”右边一个戴个口罩的工作人员热情地问。
“手机app上限制了一万,我想提高下。”
“窗口排下队。”这时,左边的保安递过来一个塑料封着的口罩。
“一定爱戴口罩咪?”我问。
“系。”
“我有。”我没接保安的口罩,我从我的包里取出口罩,然后走出玻璃门,将口罩戴上后,再进。

取到号后,显示前边有9个人排着。我闲着,就在网点里转着圈走,看看摆的设备和墙上贴的公示信息。大概是,左边靠墙的是自助设备,设备很新,但几乎没客户使用,后边来了一个“广电”的人打开前档板修机子。右边是两个柜台窗口,窗口前边摆着几张凳子,给排队的人坐的。厅中间是一个门,里边写着理财之类的。取号机上边的网点人员资质公示栏中,有五个人。五个人中,四个是“经理”的头衔,一个是柜员;四个经理中,有三个是英语专员,一个是方言专员;我看了好几眼赵经理的头像,因为十几年前,她在东山路的网点时,帮我办理过谷歌广告收入的美元西联汇款入账,她教我填表之类的;我对着黄经理的头像还笑了笑,因为也是十多年前吧,我上东山岭时拦住了她,问她有十万,买个什么理财好。

柜台窗口受理业务较慢,且后边来的人还可以凭VIP之类的权限插号。我无聊得在网点里走来走去。我留意了一下,当时在厅里等候办理业务的人,年龄看起来都比我大,五十岁以上的吧。我听到其中一个窗口的谈话,大概是因为老人家在自助设备上插卡使用时,把卡插反了,导致卡被吞过,现在他要求在人工柜台上办理业务,不想再去ATM机上了。一个拄着两根拐杖的老大爷,好像是来取钱的,数额我没听清,好像柜员问他是问是不是取两百。一个在前台填着表,说要办理被“非柜”业务的。我还看到有工作人员从里边出来,一只手提着洗衣液,另一只提着一罐食用油,似乎是银行发给客户的礼品。也有不用在厅里排队,直接到里边办理业务的,但我不知道具体是什么业务,反正她比我后来的,倒是比我先办好业务了,出门时脸上还笑嘻嘻跟前台打招呼。

轮到我时,我看了看表,等了约四十分钟。我隔着玻璃,又将遇到的问题说了一下,还特意举起手机,让柜员看限额的界面。我问她是什么原因,她用普通话说不确定,要先查查。然后她让我坐下对着摄像头,摘下口罩后拍照,然后再凭密码调整交易额度。我看到无纸化平板上显示的金额确实是提高了,然后我签了名。她说我用电子签的名太潦草,要我重新签一下。我不得不工工整整地再写一次我的名字。签好名后,我问是不是好了。她让我重装一下邮政银行app,看看是不是有效果。她说我当前的是凭交易密码验证的,限了一万。我操作了一下手机app,还是限额一万。我问是不是一定要卸载重装app,她说是,不然回去后发现不行又要来网点一趟。我有点不耐烦,可能是因为早上喝了杯奶粉,尿出。我想了想,说,就这样,结束办理,我要走了。憋尿对肾不好,我心里对自己说。

出了邮政银行网点,我又看了看表,不到五分钟。路过工行网点时,我走了进去。我拿着手机问保安,手机app上提示要来网点凭电子密码器提升权限,怎么办理。保安瞄了我一下,侧着头向着旁边的自助设备上微微仰了一下头,意思让我去找在那儿的工作人员。我等那个高高、身材笔直的后生小伙。小伙为那个客户办好后,问我干什么。
“我爱改信用卡密码。手机app话爱提升权限。”
“卡呢?”
“佢话密码器之类嘅啊。”我指着app上的界面强调。
“冇用。拿卡来啊。”小伙干练地答。
“身份证呢?”我递过卡给他,他将卡插到自助设备里。又问我要身份证。
我看到设备的屏幕提示拍照,我就取下口罩,拍好。
“签只名。”小伙从另一个客户那转过身,指着屏幕对我说。
我签了。
“重置好了。得了。”小伙说。
“那只新密码系查询密码还系交易密码喔?”我有点困惑,问他。
“吖咪不咪一样嘅?”小伙反问我。
“好,好。得了,得了。多谢。”我也干脆点,想快点儿走,尿又出。

我回到家里,上厕所舒服之后,拿出手机来验证办理的结果。工行设置的密码有效,凭交易密码加电子验证器,可以通过手机app重置卡的密码。邮政银行app依旧限制交易一万,我点击“安全检测中心”后,提示建议,“开通转账汇款权限”和“加办电子令牌,提升转账限额”,这两项都需在网点办理。

对比之下,两间银行办结业务的体验,天上与地下的差别。虽然两者办理业务的实际时间不到五分钟,但工行不用排队等,直接用自助设备操作,工作人员审核就得,办得成功。邮政银行的工作人员对(手机app)业务不熟悉,耗时耗力,做了无用功。邮政银行网点虽然也有设备,有充足的工作人员,但都是摆设般,效率没因此提高。原本邮政银行的网点多是优势,但现在有意减少柜台窗口,降低了服务体验。我原本就恐惧去医院,但如邮政银行工作人员这样戴口罩、拿触屏笔、甚至坐在玻璃窗后边的柜员还戴着橡胶手套操作的场景,令我感到是被“另眼看待”的,如同一个有传染病的病人。倒是工行相对于以前,现在一进门就可以看到两个开放式的柜台,没有玻璃隔着,显得亲近些,十几年前东山路的邮政银行网点不也是这样的开放服务柜台的吗?都戴着口罩,我认不出曾经的“邮妹”,记不到你那张清纯得人切的脸了。